⛓️ devops | September 16, 2021
Ansible의 기본적인 개념과 용어 애드혹, 플레이북의 사용 방법에 대해 알아봅시다.
IaC(Ansible) - 코드로써 인프라를 다루는 도구입니다.
여러 개의 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구입니다.
앤서블은 플레이북이라는 파일에 실행할 구성을 선언해 놓으면, 필요할 때 마다 자동으로 실행시킬 수 있는 것이 가장 큰 특징입니다.
AWS에서의 비슷한 자동화 도구로 OpsWorks 서비스가 존재하고,
이는 chef, puppet(openstack - packstack) 기술로 이루어져 있습니다.
인벤토리 : 어디서 수행할 것인지?
모듈 : 어떻게 수행할 것인지? 를 정의합니다.
인벤토리는 앤서블에 의해 제어될 대상을 정의합니다.
여러 서버들의 SSH 접근 IP, 포트, 사용자와 같은 접속 정보를 정의합니다.
yaml
포맷으로 설정합니다.플레이북은 앤서블의 핵심 역할을 하는 것이며, 단독으로 사용하는 것이 아닌, 인벤토리와 플레이북의 조합으로 사용됩니다.
name
: 플레이명hosts
: 인벤토리에 정의한 그룹명 지정 또는 관리할 서버의 대상을 작성become
: 권한 상승 역할(sudo)tasks
: 실제 어떤 일을 수행할 것인지 해야할 일들을 정의묘듈은 플레이북에서 task
가 어떻게 수행될지를 정의하는 요소입니다.
앤서블은 많은 모듈을 보유하고 있고 해당 모듈을 이용해 사용하는 것입니다.
참고하기
앤서블에서 Agent의 역할을 수행하는 것은 python 입니다.
즉, python 설치는 필수적으로 필요하지만 리눅스 환경에서는 파이썬이 기본적으로 설치되어 있기 때문에 앤서블은 agent가 없다고도 말합니다.
애드혹이란?
애드혹은 라틴어로서 “이것을 위해”라는 뜻을 가지고 있고, 명령어 한줄 단위로 작업하는 것을 말합니다.
한줄로 처리하기 번거롭고, 자주 있을 반복적인 작업은 playbook 을 활용해야 합니다.
애드혹의 명령어 사용법은 ansible "all 또는 인벤토리" -m "모듈명" [-a] [구문 명령어]
$ hostnamectl set-hostname "호스트명 지정"
epel repo 등록하기
yum install epel-release -y
$ yum --enablerepo=epel -y install ansible
$ ansible --version
인벤토리 설정
$ vi /etc/ansible/hosts
...
ansible-ip 등록 # 현재는 실습상 ansible도 하나의 관리할 서버로 가정하고 넣었음
server01-ip 등록
server02-ip 등록
등록한 서버의 ping 모듈을 통한 테스트
-m
옵션은 모듈을 뜻하고, 여기서 ping
자체가 모듈 이름임(즉, ICMP 프로토콜을 이용하는 것이 아닙니다.)$ ansible all -m ping
비밀번호를 입력하기 위해 -k
옵션 부여 후, 비밀번호 입력
-k
옵션은 ask를 뜻함$ ansible all -m ping -k
RSA key 만들기
ssh-keygen
: key generate-t
: 타입을 뜻함$ ssh-keygen -t rsa
$ ls -al .ssh/
$ ssh-copy-id root@"서버ip"
검증 - 패스워드 없이 키 방식으로 접속이 되는 것을 확인
$ ansible all -m ping
$ echo "192.168.56.101" >> inventory.list
$ echo "192.168.56.113" >> inventory.list
cat inventory.list
해당 파일에 있는 정보를 가지고 ping 모듈 테스트
-i
옵션 :$ ansible all -i inventory.list -m ping
$ ansible 192.168.56.113 -i inventory.list -m ping
--list-hosts
명령어를 통해 관리하고 있는 호스트의 ip주소를 확인하기$ ansible 192.168.56.113 -i inventory.list -m ping --list-hosts
참고하기
CHANGE
표시가 뜨는 것은 어떤 변화가 있을 때를 나타냅니다.
uptime
명령어를 통해 인벤토리 서버의 시간 확인하기
-a
옵션 : 리눅스 명령어 구문 입력을 의미함$ ansible all -m shell -a "uptime"
df -h
명령어를 통해 현재 인벤토리 서버의 디스크 사용량 확인하기$ ansible all -m shell -a "df -h"
위에서 key-keygen
명령어를 통해 만들어진 키가 잘 들어있는지 확인하는 등 응용이 가능합니다.
$ ansible all -m user -a "name=kosta"
$ ansible all -m shell -a "tail -n 1 /etc/passwd"
인벤토리 서버에 추가한 유저 삭제하기
absent
명령어는 삭제하는 명령어임$ ansible all -m user -a "name=kosta state=absent"
# 확인
$ ansible all -m shell -a "tail -n 1 /etc/passwd"
인벤토리 서버에 yum 모듈을 사용해 설치하기
present
명령어는 추가하는 명령어$ ansible all -m yum -a "name=httpd state=present"
curl
명령어를 통해 index.html 파일을 만들기
-o
옵션은 output의 의미$ curl https://www.nginx.com -o index.html
인벤토리 서버에 위에서 만든 index.html 파일을 copy 하기
src
옵션 : source를 의미함dest
옵션 : destination를 의미함$ ansible all -m copy -a "src=index.html dest=/var/www/html/index.html"
인벤토리 서버에서 httpd 웹 서버를 위에서 만든 index.html로 구동시키기
started
옵션 : 서비스를 실행하는 명령어stopped
옵션 : 서비스를 중지하는 명령$ ansible all -m service -a "name=httpd state=started"
$ ansible all -m service -a "name=httpd state=stopped"
$ ansible all -m yum -a "name=httpd state=absent"
인벤토리 서버 중 우분투 [ubuntu]로 이름 지정된 서버만 구동시키기
pkg
옵션 : package를 의미함 (yum에서는 name으로 지정했었음)# cat 명령어를 통해 확인
$ cat /etc/ansible/hosts
# ubuntu로 지정된 이름의 서버만 apt로 아파치2를 설치
$ ansible ubuntu -m apt -a "pkg=apache2 state=present"
$ ansible ubuntu -m copy -a "src=index.html dest=/var/www/html/index.html"
$ ansible ubuntu -m apt -a "name=apache2 state=stopped"
$ ansible ubuntu -m apt -a "name=apache2 state=absent"
같은 일을 반복하는 작업을 멱등성이 없다라고 합니다. 즉, 멱등성은 동일한 작업은 건너띄고 수행하지 않는 것을 의미합니다.
하나의 파일 안에 같은 내용이 있는지 파악 및 내용 추가하기. 즉, lineinfile
모듈의 멱등성 테스트
localhost
옵션 : 현재 작업하고 있는 앤서블 코어의 로컬을 의미-c
옵션 : ssh 프로토콜을 이용하지 않겠다는 의미lineinfile
옵션 : 파일 안에서 라인 한줄을 추가하겠다는 의미현재 192.168.56.113 라인이 3개 존재하고 있음
$ ansible localhost -c local -m lineinfile -a "path=inventory.list line=192.168.56.113"
검증 - 똑같이 3라인만 존재하는 것을 확인
lineinfile
모듈은 멱등성이 있는 모듈이라고 판단할 수 있습니다.참고하기
플레이북은 한줄씩 명령어를 실행한 앞선 애드혹과 다르게
한번에 스크립트를 작성해 자동화 하는 것을 의미합니다.
플레이북 작업에 사용할 디렉토리 생성 및 진입
&_
옵션 : 직전에 생성한 디렉토리 진입$ mkdir playbook && cd $_
플레이북에 사용할 yaml 파일 작성
gather_facts
옵션 : 관리할 수 있는 정보들 중(ip정보, mac 정보, 호스트네임 등) 인벤토리 서버의 정보를 변수로 활용 가능한 것들$ vi nginx_install.yaml
# [nginx_install.yaml]
---
- name: Install nginx on CentOS
hosts: centos
gather_facts: no
tasks:
- name: install epel-release
# ansible centos -m yum -a "name=epel-release state=latest" 와 의미가 같음
yum: name=epel-release state=latest
- name: install nginx web server
yum: name=nginx state=present
- name: upload default index.html for web server
# get_url : 해당 url를 가져옴 / mode : chmod 644 명령어와 동일
get_url: url=https://www.nginx.com dest=/usr/share/nginx/html mode=0644
- name: start nginx web server
service: name=nginx state=started
작성한 플레이북을 실행하기
-v
옵션을 부여하면 됨$ ansible-playbook nginx_install.yaml
$ vi remove_nginx
# [remove_nginx.yaml]
---
- name: Remove nginx on CentOS
hosts: centos
gather_facts: no
tasks:
- name: remove epel-release
yum: name=epel-release state=absent
- name: remove nginx web server
yum: name=nginx state=absent
$ ansible-playbook remove_nginx.yaml
# ansible f
궁금해서 물어본 내용 - 클라우드 환경이 아닌 가상화 관리 방식
아래는 VMWare 베이스로 유료